console.log('AAAA') // 同步任务，立即执行

// 异步任务，走定时器触发线程
setTimeout(()=> {console.log('BBBB')}, 1000)

// 同步任务，立即执行。
// 阻塞3s，1s后上面的定时器到时间，将回调函数推入macrotasks（宏任务队列）
// macrotasks [console.log('BBBB')]
const start = new Date()
while (new Date() - start < 3000) {}
console.log('CCCC')

// 异步任务，走定时器触发线程。定时器到时间，将回调函数推入macrotasks（宏任务队列）
// macrotasks [console.log('BBBB'), console.log('DDDD')]
setTimeout(()=> {console.log('DDDD')}, 0)

new Promise((resolve, reject) => {
  // 同步任务，立即执行。
  console.log('EEEE')
  // 执行出错，走catch方法，将catch回调函数推入microtasks（微任务队列）
  // microtasks [console.log('HHHH')]
  foo.bar()
})
.then(() => console.log('FFFF'))
.then(() => console.log('GGGG'))
.catch(() => console.log('HHHH'))

// 同步任务，立即执行。
console.log('IIII')


/**
 * 总执行流程
 * 先执行所有同步任务，依次执行微任务队列中的所有任务并出队，执行一个宏任务并出队，检查微任务队列为空，继续执行下一个宏任务并出队
 * 执行结果
 * AAAA CCCC EEEE IIII HHHH BBBB DDDD
 */
